package com.dwy2002.room.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dwy2002.common.Result;
import com.dwy2002.common.exception.EmptyIdException;
import com.dwy2002.pojo.dto.rooms.UnavailableDateDTO;
import com.dwy2002.pojo.po.rooms.UnavailableDates;
import com.dwy2002.pojo.vo.UnavailableDatesVO;
import com.dwy2002.room.mapper.UnavailableDateMapper;
import com.dwy2002.room.service.IUnavailableDateService;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import static com.dwy2002.common.Result.handleResult;
import static com.dwy2002.common.Result.saveResult;
import static com.dwy2002.common.utils.Utils.isEmptyOrNull;
import static com.dwy2002.common.utils.Utils.isListEmpty;

/**
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/02/12
 */
@Service
public class UnavailableDateServiceImpl extends ServiceImpl<UnavailableDateMapper, UnavailableDates> implements IUnavailableDateService {
    /**
     * 检查包间是否可用
     *
     * @param id    包间ID
     * @param dates 预约日期集合
     * @return true：所有日期可用，false：有一个或多个日期不可用
     * @author 杜伟毅
     * @since 2025/2/12 0012 19:08
     */
    @Override
    public boolean isRoomAvailable(String id, List<LocalDateTime> dates) {
        if (isListEmpty(dates) || isEmptyOrNull(id)) throw new EmptyIdException("isRoomAvailable");

        // 查询所有不可用日期
        List<UnavailableDates> unavailableDates = list(new LambdaQueryWrapper<UnavailableDates>()
                .eq(UnavailableDates::getRoomId, id)
                .in(UnavailableDates::getUnavailableDate, dates));

        // 提前提取不可用日期的集合
        Set<LocalDateTime> unavailableDateSet = unavailableDates.stream()
                .map(UnavailableDates::getUnavailableDate)
                .collect(Collectors.toSet());

        // 检查所有日期是否均不在不可用集合中
        return dates.stream()
                .noneMatch(unavailableDateSet::contains);
    }

    /**
     * 删除预约时间
     *
     * @param id   包间id
     * @param date 预约的日期
     * @return true:删除成功，false：删除失败
     * @author 杜伟毅
     * @since 2025/2/14 0014 21:51
     */
    @Override
    public boolean removeUnavailableDate(String id, LocalDateTime date) {
        return remove(new LambdaQueryWrapper<UnavailableDates>()
                .eq(UnavailableDates::getRoomId, id)
                .eq(UnavailableDates::getUnavailableDate, date));
    }

    /**
     * 删除预约时间(根据日期id)
     *
     * @param id 日期id
     * @author 杜伟毅
     * @since 2025/5/8 0008 13:01
     */
    @Override
    public Result<Void> removeUnavailableDate(String id) {
        boolean remove = removeById(id);
        return handleResult(remove, "删除不可预约时间成功", "删除不可预约时间失败");
    }

    /**
     * 获取包间的不可被预约的日期
     *
     * @param id 包间id
     * @author 杜伟毅
     * @since 2025/5/5 0005 13:46
     */
    @Override
    public List<UnavailableDatesVO> getUnavailableDate(String id) {
        if (StringUtils.isEmpty(id)) throw new EmptyIdException("getUnavailableDate");
        LambdaQueryWrapper<UnavailableDates> lqw = new LambdaQueryWrapper<>();
        lqw.eq(UnavailableDates::getRoomId, id);
        return BeanUtil.copyToList(list(lqw), UnavailableDatesVO.class);
    }

    /**
     * 设置不可预约的时间
     *
     * @param dto 接收前端的不可预约日期
     * @author 杜伟毅
     * @since 2025/5/7 0007 23:47
     */
    @Override
    public Result<Void> saveUnavailableDate(UnavailableDateDTO dto) {
        boolean save = save(BeanUtil.copyProperties(dto, UnavailableDates.class));
        return saveResult(save, "设置成功", "设置失败");
    }
}
